home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-09-22 | 38.2 KB | 1,008 lines |
- ;-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T----x
- ;Labels (16) Instructions (48) Comments (30++)
- ; $VER: DeliRave 1.0
- ; Started: 980216
- ; Location: Waratah.au
- ; Last drunk: 10 days ago
- ; Last stoned: Today (NM)
- ; Mood: Homesick
- ; Todays wishes: 1> LAG 2> Return to Sweden
- ; Changed: 980217, 980218, 980219, 980222, 980223, 980224, 980225
- ; Changed: 980302, 980303, 980304, 980306, 980308, 980310, 980313
- ; Changed: 980314, 980315, 980324, 980410, 980411, 980413, 980906
-
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * ... *
- * ::::::.::::::. :::::::. .:: ::::::. .::::. ::: *
- * .::.::'.::..:: .::..::' ...`::..::..'' .::. `' *
- * ::: :::: ::::::: `::.::::::'::::.::.::::::' ::: *
- * .................................................. *
- * *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-
- ; Captain's log...
- ;
- ; 980216:2125 (001) Got this source from Peter Kunath yesterday. Managed to assemble it today,
- ; and I'm right now trying to figure out how to use it, commenting it as much
- ; as possible.
- ; 980216:2317 (002) I have decided how to implement the Ravescope to delitracker. When the
- ; genie (DeliRave) is started, it will first FindTask("RaveScope"). If it is
- ; found everything is fine, they will establish a connection where DeliRave is
- ; feeding data to the RaveScope. If it is not found, DeliRave will try to load
- ; its config (DeliRave.config, amongst the other delitracker genie configs).
- ; The config will, amongst other things, contain the path to the RaveScope
- ; executable. If the config was not found a default path will be used. DeliRave
- ; tries to start the RaveScope, if it succeeds everything is fine, if not, some
- ; sort of action will be taken.
- ; To configure the genie, select the Config button in the list of Genies. This
- ; will pop up a window with a single button "Select ravescope path". The window
- ; will have the standard delitracker menus, i.e I'll use Deliriums routines here.
- ; ** I'm now storing dr_Data into the TC_Userdata field of the Delirave's task.
- ; dr_Data will be DeliRave's global data-structure, eventually.
- ; 980216:2357 (003) I appear to have removed the level 3 interrupt routines, the timer-device
- ; routines and related routines, without causing any damage...
- ; 980217:0018 (004) Removed some scope and window display routines.
- ; 980217:0028 (005) Removed routines (and structures) related to the scope's rastport & bitmap.
- ; 980217:1537 (006) Changed some global names to use the prefix dr_. Aligned source to start
- ; on the second column.
- ; 980217:1653 (007) Added dr_Init, to be called from dr_Begin and dr_Config. It gets the
- ; library bases from DeliBase, opens utility library (if not open already) and
- ; stores a ptr to itself (thistask) plus stores the address to dr_Data in the
- ; TC_Userdata field (if this has not been done already). I'm going to make all
- ; the routines here get/store the local data relative to a5=dr_Data.
- ; 980217:1816 (008) Removed the appear and disappear routines temporarily. Managed to move the
- ; window open routine to the Config part. So when config is pressed, the old
- ; window shows up. It waits for CTRL-C, window messages and delitracker messages.
- ; These delitracker messages seems to be caused by the buttons in the Geniewindow.
- ; Some, or all, messages prompts the routine to jump to another routine. So, the
- ; Begin routine jumps to the Config routine... when in the config, it seems that
- ; there will be no more delimessages, because the pointer turns to a wait-pointer.
- ; So I'm unsure if I need to wait for delimessages in the config...
- ; 980218:0032 (009) Added a few gadget-routines to the open/close window routines, and also
- ; made them access the data relative to a5. It worked from the start! So now I have
- ; a 'Select executabe...' gadget in the config-window! (does nothing yet though).
- ; 980218:0138 (010) dr_Init will now open reqtools.library and allocate a filerequest
- ; structure. When the 'select executable...' button is pressed, a reqtools
- ; filerequester pops up.
- ; ** There seem to be a problem though. Sometimes when I press the config-window's
- ; close-gadget, delitracker will load the next module!! Hmm... this is probably
- ; because delitracker is somehow halted while I'm in the config-part, since
- ; the message that caused DeliRave to go into the config-mode isn't replied to
- ; until I exit it. The mpega config spawns a new process for itself, maybe this
- ; is why.
- ; 980218:1645 (011) Made a config-structure with room for future improvements (to include
- ; all settings the Ravescope can have). The selected filename is stored in
- ; the settings now.
- ; 980218:1924 (012) The Show button now calls rs_Appear, which will Execute("Run ravescope")
- ; or whatever the path is. Wrote a routine in the RaveScope source that will
- ; establish the connection, but I haven't written a corresponding routine for this
- ; genie yet. Moved the config structure and global data structure definitions
- ; into an include file, and made a .h version of it for inclusion by the Ravescope.
- ; 980219:1752 (012) Made some more variable references relative to a5. Apparently Delitracker's
- ; internal routines for locking/unlocking the public screen require a5 to be
- ; loaded with DeliBase.
- ; 980219:1823 (013) Made the rest of the references a5-relative and moved dr_Data into a
- ; BSS section.
- ; 980223:1331 (014) I have now managed to establish a connection between the ravescope and
- ; DeliRave. Seems to work fine.
- ; 980224:1957 (015) Added many flags and variables to the ScopeHeader and ScopeChannel
- ; structures. There's now 3 ScopeHeader structures in the DeliRave global data.
- ; When the interrupt is called, I will from there called dr_Get4Update. It will
- ; look on these three headers to determine the one that is most suitable to
- ; update, at the same time increasing their "freshness" values. If a header
- ; has its scph_DISPLAYED flag set, it means that this header and its channel
- ; structures are being used at the moment to display the scope. This header is
- ; thus immediately disregarded. If there are several likely candidates, the one
- ; that is least fresh (i.e was updated the longest time ago) will be returned to
- ; the interrupt for update, after the scph_UPDATED flag has been set.
- ; ** The RaveScope will call dr_Get4Disp, a similar routine that will look at the
- ; three ScopeHeader structures to determine which one is the most suitable for
- ; display. If a header has its scph_UPDATED flag set, it means it's being updated
- ; at the moment, and thus it's disregarded. If the flag scph_INVALID is set, it
- ; means that this header has already been used to produce a display, so it is
- ; likewise disregarded. If there's several ScopeHeader structures that are available
- ; for display, the one that is the freshest (i.e was updated most recently) is
- ; chosen by setting its scph_DISPLAYED flag. Before it is returned to the RaveScope
- ; though, the scph_UPDATED flag is checked. If it has been grabbed and set by the
- ; interrupt in the meantime, it's not possible to display it, so the whole
- ; dr_Get4Disp is called again.
- ; 980224:2017 (015) dr_StartRave and dr_StopRave will start/stop the ravescope
- ; dr_InitPlay (which I guess is called when Delitracker has been stopped (and
- ; deallocated its audiochannels) will now examine the NoteInfo structure to
- ; determine the amount of channels the player can supply. If there are no allocated
- ; channel structures, 16 will be allocated 3 times (one set for each ScopeHeader).
- ; If there are some, but not enough, the old ones will first be deallocated.
- ; Then the scph_MaxChans will be doubled. If this isn't enough it will be doubled
- ; again until it is equal or larger than the amount of channels DeliTracker will
- ; supply to it. If the allocation is successful, all headers and their channel
- ; structs are inited. The scope is then started.
- ; ** dr_EndPlay (which I guess is called when the eject button is pressed in
- ; Delitracker) will stop the scope and clear some important fields in the notechan
- ; structures, to make sure they are not used later for display by the RaveScope.
- ; 980225:0030 (016) Made a debug macro (DBUG) which will call KPrintF and print the supplied
- ; string, without changing any registers. Filled the source with this macro...
- ; 980225:0117 (016) Fixed some problems related to the rs.scope_stop and rs.scope_stopped
- ; being BOOL (16 bits) and not byte as I used on the asm-side.
- ; ** Eject (after play) results in:
- ; dr_StopSnd, dr_EndSnd, dr_EndPlay.
- ; ** When, after eject, I press play, this is the order:
- ; dr_InitPlay, dr_InitSnd, dr_StartSnd.
- ; ** When I turn off the sound with the play/pause button, dr_StopSnd is called.
- ; When I turn it on again (play after pause), dr_StartSnd is called.
- ; ** When I turn it off with the stop-button, these are called:
- ; dr_StopSnd, dr_EndSnd, dr_InitSnd.
- ; Play after stop results only in dr_StartSnd.
- ; ** Stop after pause = dr_EndSnd, dr_InitSnd,
- ; eject after stop = dr_EndSnd, dr_EndPlay.
- ; These are not always called though! May depend on the module format.
- ; It seems I need to call some of those routines manually when delirave is
- ; started when delitracker is already running.
- ; Also appear to be some problems with NCHD_Ignore. All (or so it seems)
- ; channels are ignored for s3m:s, xm:s and indigo trackers..
- ; 980225:1536 (016) I'm now opening the timer.device and allocating a message port for it,
- ; to make use of Peter's routines to calculate the sample locations.
- ; ** Changed 4 quitflag bytes into bits to fit into one single byte, dr_oStopFlags.
- ; The RaveScope now only need to check this byte to determine if DeliRave is
- ; active or not.
- ; ** The DRSFB_PLYSTOPPED is supposed to be set ONLY when delitracker (and
- ; not DeliRave) is stopped. This flag is updated in StartSnd and StopSnd only.
- ; When DeliRave needs some privacy, it will call dr_StopRave, which will no longer
- ; set the delitracker stop-flag, but DRSFB_DELIBUSY and signal to the RaveScope
- ; that it must stop, by setting the scope_stop and waiting for scope_stopped to
- ; become true.
- ; 980302:0132 (017) Corrected many bugs, and finally got a display! But it seems that every
- ; second time DoWrapped is called, a blank frame will be produced (because it
- ; flickers a lot) and what's worse, the sample pointers do not seem to be updated
- ; at all (only the initial position appear to be correct).
- ; 980302:0202 (017) Yes! I had forgotten to add the elapsed sample bytes to the pointers!
- ; I only subtracted it from the remaing bytes. Looks much better now, but still
- ; flashes.
- ; 980302:1835 (018) Got it to work today! To start with I had forgotten that when updating
- ; the channel structures, I needed to know their previous values, since using
- ; several sets of structures, there would be a new set each time.
- ; Also I had some problems with the scph_oFlags not being set/cleared properly,
- ; so the routine to get headers ready for update/display didn't produce the
- ; wanted result. I'm right now fighting with enforcer hits occuring sometimes
- ; when I change module (from the wrapped's inner loop). I've now tried to init
- ; the critical fields in the scopechannel structures each time a new module is
- ; loaded.
- ; 980302:2102 (019) Enforced a very strict sieve policy in the NoteSignal routine, to get
- ; rid of 'locked' sample-loops. Seems to work very well (too well sometimes
- ; perhaps). I've been trying many mods, and they all seem to work good. But
- ; 8 channel octamed modules (orpheus ones) will display a lot of crap, which
- ; could be because of a certain sample.. Don't know, haven't found other 8
- ; channel octameds...
- ; ** Began with a 10 channel fasttracker mod (first in trance), but DeliRave
- ; allocated 32 channels for it! (didn't use them, just alloc room for it).
- ; 980302:2133 (019) trance/blueprint is s3m and uses unsigned samples.
- ; 980303:1835 (020) Unsigned samples are no longer a problem.
- ; ** But my new sample-nuke policy made the mp3's flicker again. I commented
- ; out the 'check if new samplepos = old samplepos and nuke if so' line, and this
- ; got rid of it. Some pt-mods with loops seem to flicker still though.
- ; 980304:0113 (021) Rewrote and optimized the routine to keep track of the sample positions.
- ; The result is much better!
- ; 980304:0113 (022) Added two menu items, Popup = steal and Quit = kill. I have problems with
- ; killing the RaveScope without causing deadlocks. Will have to try again when
- ; I'm not so tired & confused.
- ; 980304:1528 (022) Phew, finally it works.
- ; 980304:1637 (023) Moved the dr_Get4Update into the monoscope source. I'm calling it now
- ; through a pointer supplied by the RaveScope.
- ; 980304:1836 (023) Did the same with the routine to check if the new amount of channels for
- ; a player is enough, and double the #of channel structures if it isn't. It's
- ; now called ms_GetRoom, and its address can be found in dr_oGetRoom_f.
- ; 980304:2038 (023) Added some routines to pass a correct DeliRave config to the RaveScope.
- ; Does not work properly yet (I think it's corrupted).
- ; 980306:1355 (023) The config can be loaded and saved now and will be passed correctly.
- ; 980308:0156 (024) Added a check for 020 in the beginning and an Easyrequester if no 020
- ; was found. Also added a requester for when the RaveScope could not be found.
- ; 980308:1535 (024) Now DeliRave will not kill the RaveScope if it is used by another player.
- ; 980310:2320 (025) Had horrible problems with the whole project, as the config must have
- ; gotten invalid, producing *hard* crashes. The config can no longer be saved
- ; when the RaveScope is not present.
- ; ** I rewrote the FindRave routine, so it will no longer try to Execute() the
- ; RaveScope several times. Also Peter Kunath told me that he couldn't get his
- ; old version to work. And it locked when starting DeliTracker from icon. I'm
- ; opening NIL: filehandles now and I'm going to pass them to Execute()....
- ; 980310:2337 (025) At least this works for me when starting DT from icon.
- ; 980314:2257 (026) Changed the Execute() call (to start the Ravescope) into a SystemTagList()
- ; call. Had much problems with this, and I had to give up trying to pass the tag
- ; NP_Arguments, as it did not work with a input handle as NIL: or anything else
- ; I tried. Gave enforcer hits and made nothing.
- ; 980315:0012 (027) Changed the flag (Popup etc) handling. Made it more modular and attempted
- ; to make it accurately visualize the current settings (after a reset config).
- ; But I had to close the config-window and reopen it to make that happen.
- ; Reinserted the routines to keep track of the window positions. Don't know why
- ; I removed that since the positions are stored in the config...
- ; 980315:2054 (027) Released version 1.0 (RaveScope v1.1) on Aminet with this source (027).
- ; 980324:0417 (028) Peter reported some enforcer-hits. The originated from a move.l from
- ; the old scopechannel structure. The old scopechannel structure could be zero
- ; sometimes. If it is, I'll branch to a routine which does not access the old
- ; scopechannel structure, but I found that in a certain case it would branch
- ; out of this routine, to the one that do access it! Fixed this...
- ; 980411:1641 (029) I'm cutting out most of this source, as I am now rewriting it to work
- ; with the new host concept. So instead of having delitracker specific routines,
- ; I call a similar routine from hostfuncs.o. Removed everything that dealt with
- ; the config window.
- ; 980413:0142 (029) It works with the RaveScope again, finally.
- ; 980906:1227 (058) Sometimes after a module had been stopped, delirave would send a PLYACTIVE
- ; message from dr_InitSnd. Removed this which fixed the problem.
- ; 980922:0007 (065) *** Released version 1.2 on Aminet with this source (065).
-
- MACHINE 68020
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- SECTION GenieCode,Code
-
-
- INCDIR include:
- INCLUDE delitracker/DeliPlayer.i
-
- PLAYERHEADER GenieTagArray
-
- dr_Version: dc.b '$VER: RaveScope-Genie 1.2 (22.9.98)',0
- even
-
- GenieTagArray dc.l DTP_RequestDTVersion,17 ; minimum DT version needed
- dc.l DTP_PlayerVersion,01<<16+02 ; actual player version & revision
- dc.l DTP_PlayerName,GName * name of this player/genie
- dc.l DTP_Creator,CName * author of the player/genie
- dc.l DTP_Description,DName * description of the player/genie
- dc.l DTP_DeliBase,dr_oDeliBase+dr_Data * store DeliGlobals ptr here
- dc.l DTP_Process,dr_Begin ; pointer to process entry code
- dc.l DTP_Priority,-5 ; priority of the process
- dc.l DTP_StackSize,4096 ; stack size of the process
- dc.l DTP_MsgPort,dr_oDeliPort+dr_Data * DT sends msgs to this port
- dc.l DTP_NoteInfo,dr_oNoteInfo+dr_Data * Store ptr to NoteStruct here
- dc.l DTP_NoteSignal,dr_NoteSignal ; ptr to NoteSignal interrupt code
- dc.l DTP_Appear,dr_Appear * routine to open the window
- dc.l DTP_Disappear,dr_Disappear * routine to close the window
- dc.l DTP_InitPlayer,dr_InitPlay ; Get info about current player
- dc.l DTP_EndPlayer,dr_EndPlay * genie cleanup code: ply stopped
- dc.l DTP_InitSound,dr_InitSnd ; Upd chanstr here *clr chan str
- dc.l DTP_EndSound,dr_EndSnd * clear channel structs
- dc.l DTP_StartInt,dr_StartSnd * install VBL interrupt
- dc.l DTP_StopInt,dr_StopSnd * remove VBL interrupt
- dc.l TAG_DONE
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * INCLUDES &c
-
- INCLUDE exec/exec_lib.i
- INCLUDE exec/exec.i
- INCLUDE exec/tasks.i
- INCLUDE devices/timer_lib.i
- INCLUDE devices/timer.i
- INCLUDE dos/dos_lib.i
- INCLUDE dos/dos.i
- INCLUDE dos/dostags.i
- INCLUDE graphics/graphics_lib.i
- INCLUDE graphics/gfx.i
- INCLUDE hardware/intbits.i
- INCLUDE intuition/intuition_lib.i
- INCLUDE intuition/intuition.i
- INCLUDE libraries/gadtools_lib.i
- INCLUDE libraries/gadtools.i
- INCLUDE libraries/reqtools.i
- INCLUDE libraries/reqtools_lib.i
- INCDIR ""
- INCLUDE include/monoscope.i
- INCLUDE include/ravescope.i
- INCLUDE include/delirave.i
-
- XREF _rh_InitHost * Init this host
- XREF _rh_FreeHost * Free everything done in InitHost
- XREF _rh_ProcMsgs * Process msgs from Rave
- XREF _rh_WaitPutMsg * PutMsg to Rave and wait 4 reply
- XREF _rh_SignalRave * PutMsg Rave & wait IF WE HAVE IT
- XREF _rh_PlyActive * Tell Rave we're playing
- XREF _rh_ClrChans * Clear one header's channels
- XREF _rh_NukeChans * Clear all header's channels
- XREF _rh_GrabRave * Try to grab/launch the RaveScope
- XREF _rh_AddSig * Add sig (d0) to the signalmask
-
- MYDEBUG: equ 0
- DEBTIME: equ 0
- dr_RELEASE: equ 1
- dr_VERSION: equ 102
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * MACROS
-
- PUSH: MACRO
- IFC "\1","ALL"
- movem.l d0-a6,-(sp)
- ELSE
- movem.l \1,-(sp)
- ENDC
- ENDM
-
- POP: MACRO
- IFC "\1","ALL"
- movem.l (sp)+,d0-a6
- ELSE
- movem.l (sp)+,\1
- ENDC
- ENDM
-
- CALLLVO: MACRO
- jsr _LVO\1(a6)
- ENDM
- JUMPLVO: MACRO
- jmp _LVO\1(a6)
- ENDM
-
- CALLEXE: MACRO
- move.l dr_oSysBase(a5),a6
- jsr _LVO\1(a6)
- ENDM
- JUMPEXE: MACRO
- move.l dr_oSysBase(a5),a6
- jmp _LVO\1(a6)
- ENDM
-
- CALLGFX: MACRO
- move.l dr_oGfxBase(a5),a6
- jsr _LVO\1(a6)
- ENDM
- JUMPGFX: MACRO
- move.l dr_oGfxBase(a5),a6
- jmp _LVO\1(a6)
- ENDM
-
- CALLDOS: MACRO
- move.l dr_oDOSBase(a5),a6
- jsr _LVO\1(a6)
- ENDM
- JUMPDOS: MACRO
- move.l dr_oDOSBase(a5),a6
- jmp _LVO\1(a6)
- ENDM
-
- CALLGAD: MACRO
- move.l dr_oGTBase(a5),a6
- jsr _LVO\1(a6)
- ENDM
- JUMPGAD: MACRO
- move.l dr_oGTBase(a5),a6
- jmp _LVO\1(a6)
- ENDM
-
- CALLITN: MACRO
- move.l dr_oIntuiBase(a5),a6
- jsr _LVO\1(a6)
- ENDM
- JUMPITN: MACRO
- move.l dr_oIntuiBase(a5),a6
- jmp _LVO\1(a6)
- ENDM
-
- IFNE MYDEBUG ;Debug macro. Link with include:
- XRef KPrintF ;link/debug.lib & link/amiga.lib
- ENDC
-
- DBUG: MACRO
- IFNE MYDEBUG
- IFNE NARG-1
- subq.w #1,.Ctr\@
- bne .Skip\@
- move.w #\2,.Ctr\@
- bra .Debug\@
- .Ctr\@: dc.w 1
- ELSE
- bra .Debug\@
- ENDC
- .Str\@: dc.b "DELI: ",\1,0
- EVEN
- .Debug\@: DBUGIT .Str\@
- .Skip\@: *+-
- ENDC
- ENDM
-
- DBUGIT: MACRO
- IFNE MYDEBUG
- movem.l d0-a6,-(sp)
- move.l 4.w,a6
- jsr _LVOForbid(a6)
- lea \1,a0
- suba.l a1,a1
- jsr KPrintF
- move.l 4.w,a6
- jsr _LVOPermit(a6)
- IFNE DEBTIME
- move.l dr_oDOSBase(a5),d0
- beq .Skip\@
- move.l d0,a6
- move.l #DEBTIME,d1
- jsr _LVODelay(a6)
- ENDC
- .Skip\@: movem.l (sp)+,d0-a6
- ENDC
- ENDM
-
- LEASTR: MACRO
- bsr .skip\@
- dc.b \1,0
- EVEN
- .skip\@: move.l (sp)+,\2
- ENDM
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Genie/Creatorname/Description und lokale Daten
-
- GName dc.b 'RaveScope',0
- CName dc.b 'By Parsec 1998 (Erik Spåre)',10
- dc.b 'Based on a source by Peter Kunath',0
- DName dc.b 'This genie displays waveforms,',10
- dc.b '(any number of channels are supported)',10
- dc.b 'It requires RaveScope 1.2 or above.',0
- even
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Player Process
-
- dr_Begin: lea dr_Data,a5 * Get DeliRave data
- DBUG "DeliRave started.\n"
- bsr dr_Init
- beq .Quit
-
- .Main: DBUG "Going to sleep in the main-loop...\n\n"
- move.l rh_oSigMask(a5),d0
- CALLEXE Wait ; Schlaf gut
- DBUG "Yawn...\n"
-
- move.l d0,d2 ; copy SignalMask
- btst.l #SIGBREAKB_CTRL_C,d2 ; CTRL-C signal ?
- beq .DeliCollect ; nope !
- bsr dr_Exit ; suicide :)
-
- .DeliCollect move.l dr_oDeliPort(a5),a0 ; collect DeliTracker msg's
- CALLEXE GetMsg
- tst.l d0 ; Msg da ?
- beq .Collected ; Nein !
- move.l d0,-(sp) ; store ^Msg
- move.l d0,a0
- move.l DTMN_Function(a0),a0 ; get CMD
- jsr (a0) ; Befehl ausführen
- move.l (sp)+,a1 ; restore ^Msg
- move.l d0,DTMN_Result(a1) ; set Result
- CALLEXE ReplyMsg ; return to sender
- bra .DeliCollect
-
- .Collected: jsr _rh_ProcMsgs * Proc host-messages
- tst.b dr_oQuit(a5) * Quit?
- beq .Main
-
- .Quit: bsr dr_CleanUp
- DBUG "Exiting DeliRave...\n"
- rts
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Init everything
-
- dr_Init: DBUG "** Entered dr_Init.\n"
-
- move.l 4.w,a6 * Get SysBase
- move.l dr_oDeliBase(a5),a4 * Get DeliBase
- move.l a6,dr_oSysBase(a5)
- move.l dtg_DOSBase(a4),dr_oDOSBase(a5)
- move.l dtg_GfxBase(a4),dr_oGfxBase(a5)
- move.l dtg_GadToolsBase(a4),dr_oGTBase(a5)
- move.l dtg_IntuitionBase(a4),dr_oIntuiBase(a5)
- clr.b dr_oQuit(a5) * Clear the quit-flag
-
- move.l #dr_ConfigEnv,d1 * Read the envvariable DELICONFIG,
- move.l #dr_ConfigPath,d2 * constituting the path to the
- moveq #120,d3 * configuration files. Store
- moveq #0,d4 * the result in ConfigPath
- CALLDOS GetVar
- tst.l d0
- beq .Error
-
- move.l #dr_ConfigPath,d1 * Get the full path to the DeliRave
- move.l #dr_ConfigFile,d2 * config in ConfigPath
- moveq #120,d3
- CALLDOS AddPart
- tst.l d0
- beq .Error
-
- LEASTR "Delitracker",a0 * Name of your host
- lea dr_ConfigPath,a1 * Path to your config-file
- lea dr_Data,a5 * Put the RaveHost structure here
- CLEARA a2 * No tags!
- jsr _rh_InitHost * Init it...
- beq .Error * Serious error, quit and report failure...
-
- move.b #SIGBREAKB_CTRL_C,d0 * Add CTRL-C signal to the mask
- jsr _rh_AddSig
- move.b ([dr_oDeliPort,a5],MP_SIGBIT),d0 * Add DT's msgportbit to the mask
- jsr _rh_AddSig
-
- tst.l dr_oTimePort(a5)
- bne .NoTimsg
- DBUG "Creating msg-port for use with timer.device.\n"
- CALLEXE CreateMsgPort
- move.l d0,dr_oTimePort(a5)
- beq .Error
-
- .NoTimsg: tst.b dr_oTimerOpen(a5)
- bne .NoTimer
- DBUG "Opening timer.device.\n"
- lea dr_oTimeReq(a5),a1 * set ReplyPort for TimeRequest
- move.l d0,MN_REPLYPORT(a1)
- lea dr_TimerName,a0 * Get timer.device name
- moveq #UNIT_VBLANK,d0
- CLEAR d1
- CALLEXE OpenDevice * Open timer.device
- tst.l d0 * Successful? (NULL)
- seq dr_oTimerOpen(a5) * Set timer opened flag if so
- bne .Error
-
- .NoTimer: DBUG "Everything inited ok!\n"
- moveq #1,d0
- rts
-
- .Error: DBUG "Something went wrong!\n"
- moveq #0,d0
- rts
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Cleanup DeliRave
-
- dr_CleanUp: DBUG "** Entered dr_CleanUp.\n"
- bsr dr_StopSnd
- bsr dr_EndPlay
-
- tst.b dr_oTimerOpen(a5) * Was timer.device opened?
- beq .NoTime
- DBUG "Closing timer.device.\n" * Yes, so close it.
- lea dr_oTimeReq(a5),a1
- CALLEXE CloseDevice
- clr.b dr_oTimerOpen(a5)
-
- .NoTime: move.l dr_oTimePort(a5),d0 * Was msgport for timer created?
- beq .NoPort
- DBUG "Deleting timer.device's msgport...\n"
- move.l d0,a0 * Yes, delete it.
- CALLEXE DeleteMsgPort
- clr.l dr_oTimePort(a5)
-
- .NoPort: jsr _rh_FreeHost * Free the host
-
- DBUG "Everything cleaned up!\n"
- rts ; Playerprozess beenden
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Init the ScopeHeader and its ScopeChannel structures, alloc them if necessary
-
- dr_InitPlay: DBUG "** dr_InitPlay: PLYACTIVE -> Rave\n" * Tell the RaveScope (if present) that
- jsr _rh_PlyActive * we're about to play (and grab it!)
- move.w #RMSG_HOSTBUSY,d0 * Make sure RaveScope is stopped
- jsr _rh_SignalRave
- beq .Exit
-
- DBUG "## Checking NoteInfo ##\n"
- move.l dr_oNoteInfo(a5),d0 * Get notestructure
- beq .Error
- move.l d0,a3 * a3 = NoteStructure
-
- DBUG "## Checking channels ##\n"
- move.l nst_Channels(a3),d0 * pointer to first channel in list
- beq .Error
- DBUG "Calculating #of channels...\n"
- moveq #0,d6 * d6 = #of channels
- .GetNums: addq.w #1,d6
- move.l d0,a0
- move.l nch_NextChannel(a0),d0
- bne .GetNums
-
- move.w d6,d0 * New #of channels
- moveq #3-1,d1 * Three sets of chanstructs
- lea rh_oChanHdrs(a5),a0 * Pointer to channel headers
- jsr ([rh_oMakeRoom_f,a5]) * Ensure there's room 4 all chans
- beq .Error * It isn't, error!
-
- move.l a0,a4 * a4 = ptr to channel headers
- moveq #3-1,d7 * Init 3 channel headers w/structs
- .InitLoop: move.l nst_Channels(a3),d0 * Pointer to first NoteChannel
- move.l scph_oChannels(a4),a1 * Ptr to first ScopeChannel
-
- .CountLoop move.l d0,a0 * Get NoteChannel struct
- move.w nch_Stereo(a0),d0 * Get stereo field
- cmpi.w #NCHD_Ignore,d0 * Ignore this channel?
- beq .Skip * Yes!
- move.l a0,scpc_oExtChan(a1) * Store ptr to the corresponding
- move.l #8287,scpc_oFreq(a1) * Set frequency
- bra .Next * Deli NoteChannel in ScopeChannel
- .Skip: subq.w #1,scph_oNumChans(a4) * One channel less
- .Next: lea scpc_SIZEOF(a1),a1 * Go to next ScopeChannel struct
- move.l nch_NextChannel(a0),d0 * Go to next NoteChannel struct
- bne .CountLoop
-
- .MaxChannels: move.l nst_Flags(a3),d0 * get NotePlayer flags
- btst.l #NSTB_7Bit,d0
- beq .Try8
- bset.b #SCPHB_7BITS,scph_oFlags(a4) * Display 7 bit sound
- bra .BitsOk
- .Try8: btst.l #NSTB_8Bit,d0
- beq .Try16
- bset.b #SCPHB_8BITS,scph_oFlags(a4) * Display 8 bit sound
- bra .BitsOk
- .Try16: btst.l #NSTB_16Bit,d0 * Last chance. No 7/8/16 bit
- beq .Error * Specification means error.
- bset.b #SCPHB_16BITS,scph_oFlags(a4) * Display 16 bit sound
-
- .BitsOk: btst.l #NSTB_Signed,d0 * Signed Samples?
- beq .Unsigned
- bset.b #SCPHB_SIGNED,scph_oFlags(a4) * Display signed samples
- bra .SignOk
- .Unsigned btst.l #NSTB_Unsigned,d0 * Unsigned Samples?
- beq .Error * Neither signed/unsinged => error
- bclr.b #SCPHB_SIGNED,scph_oFlags(a4) * Display signed samples
-
- .SignOk: move.w nst_MaxVolume(a3),scph_oMaxVolume(a4) * Set maximum volume
- bset.b #SCPHB_INVALID,scph_oFlags(a4) * Not yet valid for display
- jsr _rh_ClrChans * Clear scopechannel structs
- lea scph_SIZEOF(a4),a4
- dbra d7,.InitLoop * Init next set of hdr & chans
-
- DBUG "All notestructures inited as follows:\n"
- ifne MYDEBUG
- move.b scph_oFlags-scph_SIZEOF(a4),d0
- btst #SCPHB_7BITS,d0
- beq 1$
- DBUG "7 Bit\n"
- 1$: btst #SCPHB_8BITS,d0
- beq 2$
- DBUG "8 Bit\n"
- 2$: btst #SCPHB_16BITS,d0
- beq 3$
- DBUG "16 Bit\n"
- 3$: btst.b #SCPHB_SIGNED,d0
- beq 4$
- DBUG "Signed samples,\n"
- bra 5$
- 4$: DBUG "Unsigned samples,\n"
- 5$: lea .Numstr+6,a0
- move.w scph_oNumChans-scph_SIZEOF(a4),d0
- bsr .PutDigit
- DBUGIT .Numstr
- lea .Nummax+6,a0
- move.w scph_oMaxChans-scph_SIZEOF(a4),d0
- bsr .PutDigit
- DBUGIT .Nummax
- bra 8$
- .PutDigit: andi.l #$FFFF,d0
- cmp.w #9,d0
- bgt 6$
- add.b #'0',d0
- move.b d0,(a0)+
- move.b #' ',(a0)
- bra 7$
- 6$: divu #10,d0
- add.b #'0',d0
- move.b d0,(a0)+
- swap d0
- add.b #'0',d0
- move.b d0,(a0)+
- 7$: rts
- .Numstr: dc.b "DELI: xx channels\n",0
- .Nummax: dc.b "DELI: xx slots currently allocated.\n",0
- even
- 8$:
- ENDC
-
- DBUG "Telling Rave we're not busy anymore\n"
- move.w #RMSG_HOSTREADY,d0
- jsr _rh_SignalRave * Restart the ravescope
- .Exit: CLEAR d0 * Signal success
- rts
-
- .Error: DBUG "Something went wrong in dr_InitPlay!\n"
- moveq #-1,d0 * Signal failure
- rts
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Daten für Scope Display updaten
-
- dr_NoteSignal: ;DBUG "Got notesignal\n",30
- movem.l d2-d7/a2-a6,-(sp)
- lea dr_Data,a5
- move.l rh_oRaveBase(a5),d0 * Are we used by the RaveScope?
- beq .Out * No, exit.
- move.l d0,a0
- tst.b rs_oStopFlags(a0) * Is the RaveScope active?
- bne .Out * No, don't update anything
-
- ; DBUG "Getting hdr 2 upd\n",30
- lea rh_oChanHdrs(a5),a0 * Find a header to update
- moveq #3-1,d0
- move.l rh_oGet4Upd_f(a5),a4 * Get adr to ms_Get4Update()
- jsr (a4) * Get d0=header struct to update
- beq .Out * None available => exit
- move.l d0,a4 * a4=header to update
-
- move.l dr_oNoteInfo(a5),d0 * Check NoteStructure
- beq .Exit * Not available, so exit.
-
- ; DBUG "Updating header\n",30
- move.l dr_oTimeReq+IO_DEVICE(a5),a6 * Get TimerBase
- lea dr_oEClockVal1(a5),a0 * read EClock Value
- jsr _LVOReadEClock(a6)
- move.l d0,d5 * EClockFreq (ticks/sec)
-
- lea dr_oEClockVal1(a5),a0 * Calc Interrupt Time
- lea dr_oEClockVal2(a5),a1
- move.l EV_LO(a0),d0
- sub.l EV_LO(a1),d0
- beq .CopyEClock
- divu d0,d5
- moveq #0,d6
- move.w d5,d6 * d6 = clock divisor
- .CopyEClock: tst.w d6 * Make sure d6 isn't zero
- bne .NotZero
- moveq #1,d6
- .NotZero: move.l (a0)+,(a1)+ * copy EClock Value
- move.l (a0)+,(a1)+
-
- ; DBUG "!Checking channels...\n",30
- move.l scph_oChannels(a4),d0
- beq .Exit
- ; DBUG "Channels !OK!\n",30
- move.l d0,a3 * a3 = ScopeChannel struct
- move.w scph_oNumChans(a4),d7 * d7 = #of channels = dbra
- move.l rh_oOldScph(a5),a6 * Get old scopeheader
- move.l a4,rh_oOldScph(a5) * This ScopeHeader old next time
- tst.l a6
- beq .OnlyNew
- move.l scph_oChannels(a6),a6 * Get old channels
- tst.l a6
- bne .BegLoop
- bra .OnlyNew
-
- .OnlyLoop: move.l scpc_oExtChan(a3),d0 * Get NoteChannel struct
- beq .Exit * Exit if not present (must be)
- move.l d0,a2 * a2 = NoteChannel struct
- CLEAR d0 * d0 = No sample length
- CLEAR d1 * d1 = No sample pos
- CLEAR d2 * d2 = No loop length
- CLEAR d3 * d3 = No loop pos
- CLEAR d4 * d4 = No frequency
- CLEAR d5 * d5 = No volume
- cmpi.w #NCHD_Ignore,nch_Stereo(a2) * skip this channel ?
- beq .NextNew * yes !
- btst.b #NCHB_Volume,nch_Changed(a2) * New volume?
- beq .SkipV * No
- move.w nch_Volume(a2),d5
- cmp.w #64,d5 * Vol may not exceed
- ble .SkipV * 64 at the moment
- moveq #64,d5
- .SkipV: move.w d5,scpc_oVolume(a3) * Store volume
- btst.b #NCHB_Frequency,nch_Changed(a2) * New frequency?
- beq .SkipF * No, use old
- move.l nch_Frequency(a2),d4 * Get new frequency
- .SkipF: btst.b #NCHB_Repeat,nch_Changed(a2) * New loop values?
- beq .SkipR * No
- move.l nch_RepeatLength(a2),d2 * d2 = new loop length
- move.l nch_RepeatStart(a2),d3 * d3 = new loop pos
- moveq #2,d5 * d5 = scratch
- cmp.l d5,d2 * Loop only 1 Word or less?
- bgt .SkipR * No !
- CLEAR d2 * Yes, don't use it.
- .SkipR: btst.b #NCHB_Sample,nch_Changed(a2) * New sample value?
- beq .SkipS * Yes, get it
- move.l nch_SampleStart(a2),d1 * d1 = new sample pos
- beq .SkipS
- move.l nch_SampleLength(a2),d0 * d0 = new sample left
- moveq #2,d5
- cmp.l d5,d0
- bgt .SkipS
- CLEAR d0
- CLEAR d1
- .SkipS: movem.l d0-d4,scpc_oSampleLeft(a3) * Store smppos,sz,loop,lpsz,freq
- .NextNew: lea scpc_SIZEOF(a3),a3
- .OnlyNew: dbra d7,.OnlyLoop
- bra .Exit
-
- .Loop: move.l scpc_oExtChan(a3),d0 * Get NoteChannel struct
- beq .Exit
- move.l d0,a2 * a2 = NoteChannel struct
- cmpi.w #NCHD_Ignore,nch_Stereo(a2) * skip this channel ?
- beq .Nuke * yes !
-
- .Volume: move.w scpc_oVolume(a6),d0 * Get old volume
- btst.b #NCHB_Volume,nch_Changed(a2) * New volume?
- beq .VolOk * No
- move.w nch_Volume(a2),d0
- cmp.w #64,d0 * Vol may not exceed
- ble .VolOk * 64 at the moment
- moveq #64,d0
- .VolOk: move.w d0,scpc_oVolume(a3) * Store volume
-
- .Frequency: move.l scpc_oFreq(a6),d4 * d4 = old frequency
- btst.b #NCHB_Frequency,nch_Changed(a2) * New frequency?
- beq .Repeat * No, use old
- move.l nch_Frequency(a2),d4 * Get new frequency
-
- .Repeat: btst.b #NCHB_Repeat,nch_Changed(a2) * New loop values?
- bne .GetNewR * Yes, get them
- movem.l scpc_oLoopSize(a6),d2-d3 * Get old loopsize and adr
- bra .RepOk
- .GetNewR: move.l nch_RepeatLength(a2),d2 * d2 = new loop length
- move.l nch_RepeatStart(a2),d3 * d3 = new loop pos
- moveq #2,d5 * d5 = scratch
- cmp.l d5,d2 * Loop only 1 Word or less?
- bgt .RepOk * No !
- CLEAR d2 * Yes, don't use it.
-
- .RepOk: btst.b #NCHB_Sample,nch_Changed(a2) * New sample value?
- bne .GetNew * Yes, get it
- .GetPos: move.l d4,d5 * Calc samples/interrupt
- beq .Nuke * No frequency => nuke channel
- move.l scpc_oSamplePos(a6),d1 * d1 = old sample pos
- beq .Nuke * None = nuke
- divu.l d6,d5 * d5 = bytes played since last time
- move.l scpc_oSampleLeft(a6),d0 * d0 = old sample left
- add.l d5,d1 * Calc new sample pos
- sub.l d5,d0 * Calc new sample left
- bgt .Store * More remain
- moveq #2,d5
- cmp.l d5,d2 * Loop exist?
- ble .Nuke * No
- move.l d0,d5 * d5=neg bytes alr played in loop
- move.l d3,d1 * SamplePos = LoopPos
- move.l d2,d0 * SampleLeft = LoopSize
- sub.l d5,d1 * Get current pos in loop
- add.l d5,d0 * and bytes left in loop
- bgt .Store * Already 0? (short loops...)
- neg.l d0 * Yes, d0=#of bytes alr played
- divu.w d2,d0 * Divide that with loopsize to get
- clr.w d0 * position offseted from start
- swap d0 * d0 = remainder & bytes left
- move.l d3,d1 * Get loopstart again
- add.l d0,d1 * Add remainder
- bra .Store * And store...
- .GetNew: move.l nch_SampleStart(a2),d1 * d1 = new sample pos
- beq .Nuke
- move.l nch_SampleLength(a2),d0 * d0 = new sample left
- moveq #2,d5
- cmp.l d5,d0 * New sample length good?
- ble .Nuke * No
- btst.b #NCHB_Repeat,nch_Changed(a2) * New loop values supplied?
- bne .Store * Yes! Don't clear them
- bra .ClrLoop
-
- .Nuke: CLEAR d0
- CLEAR d1
- .ClrLoop: CLEAR d2
- CLEAR d3
- .Store: movem.l d0-d4,scpc_oSampleLeft(a3) * Store smppos,sz,loop,lpsz,freq
- .Next: lea scpc_SIZEOF(a3),a3
- lea scpc_SIZEOF(a6),a6
- .BegLoop: dbra d7,.Loop * next channel
-
- ; DBUG "Header updated OK\n",30
- .Exit: and.b #~(SCPHF_INVALID!SCPHF_UPDATED),scph_oFlags(a4) * Struct is no longer invalid or being updated
-
- .Out: movem.l (sp)+,d2-d7/a2-a6
- rts
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Quit DeliRave
-
- dr_Exit: DBUG "** Entered dr_Exit.\n"
- st dr_oQuit(a5) * Set the quit-flag
- rts
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Hide (quit) the RaveScope
-
- dr_Disappear: DBUG "** Entered dr_Disappear.\n" * Send killmsg to the RaveScope if
- move.w #RMSG_KILLRAVE,d0 * it is present. Return d0=0 if
- jmp _rh_WaitPutMsg * it is not.
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Show (start) the RaveScope if it is not running, else try to grab it
-
- dr_Appear: DBUG "** Entered dr_Appear.\n"
- move.l rh_oRaveBase(a5),d0 * Do we have the ravescope?
- bne .Exit
- jsr _rh_GrabRave * No, grab it!
- CLEAR d0
- .Exit: rts
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Stop the ravescope, clear all the scopeheaders & their channel structs
-
- dr_EndPlay: DBUG "** Entered dr_EndPlay.\n"
- clr.b rh_oPlaying(a5) * Clear our local play-flag
- move.w #RMSG_PLYHALTED,d0 * Tell the RaveScope (if we have)
- jsr _rh_SignalRave * it) that our player is halted.
- jsr _rh_NukeChans * Nuke all channels
-
- clr.l dr_oNoteInfo(a5) * Shutdown complete
- moveq #-1,d0 * Set error
- rts
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Init Sound
-
- dr_InitSnd: rts
- ;DBUG "** dr_InitSnd: PLYACTIVE -> Rave\n" * Tell the RaveScope (if it is
- ;jmp _rh_PlyActive * present) that we're playing
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Remove Sound
-
- dr_EndSnd: DBUG "** dr_EndSnd: PLYHALTED -> Rave\n" * Tell the RaveScope (if we have
- move.w #RMSG_PLYHALTED,d0 * it) that we're not playing
- clr.b rh_oPlaying(a5) * Clear our local play-flag
- jmp _rh_SignalRave
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Display-VBlank starten
-
- dr_StartSnd: DBUG "** dr_InitSnd: PLYACTIVE -> Rave\n" * Tell the RaveScope (if it is
- jmp _rh_PlyActive * present) that we're playing
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Display-VBlank stoppen
-
- dr_StopSnd: DBUG "** dr_StopSnd: PLYHALTED -> Rave\n" * Tell the RaveScope (if we have
- move.w #RMSG_PLYHALTED,d0 * it) that we're not playing
- clr.b rh_oPlaying(a5) * Clear our local play-flag
- jmp _rh_SignalRave
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- SECTION GenieDatas,Data
-
- include include/delirave.i * Global data struct defs
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- * Window texts
-
- dr_ConfigEnv: dc.b 'DeliConfig',0
- dr_ConfigPath: dc.b 'PROGDIR:DeliConfig',0
- dcb.b 120+1,0
- dr_ConfigFile: dc.b 'RaveScope.prefs',0
- dr_DRCfgKey: dc.b " DELICONFIG",0
-
- dr_TimerName: dc.b 'timer.device',0
-
- even
-
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- *
- *
- SECTION DeliRaveBSS,BSS
- *
- *
-
- dr_Data: ds.b DeliRave_SIZEOF * DATA USED BY RS-TABLE
-